
const typeOf = function (item) {
  return Object.prototype.toString.call(item).slice(8,-1).toLowerCase()
}
/**
 * 如果不切割的话
[object Array]
[object Object]
[object Date]
 */
console.log(typeOf([])) //array
console.log(typeOf({})) //object
console.log(typeOf(new Date())) //date


const instanceOf = function (obj, constructor){
  let proto = Object.getPrototypeOf(obj);
  while(proto){
    if(proto == constructor.prototype){
      return true;
    }
    proto = Object.getPrototypeOf(proto)
  }
  return false;
}

/**
拓展：
if(typeof constructor !== 'function') {
  throw new TypeError('Right-hand side of instanceof is not a function');
}
if(obj == null || typeof obj !== 'object'&& typeof obj!=='function'){
  return false;
}
 */

/**
 * 知识点
 * 1 typeof
 *   判断基本类型，无法细分Object引用类型（Array,Object,Date） 像数组、null会被判断成object
 *   !返回的结果是字符串 typeof typeof 11 => 'string'
 * 2 instanceof
 *   顺着原型链上找, 前提是要有构造函数 不能判断基本类型和null undefined（没有构造函数）
 * 3 constructor
 *   可以判断基本类型（隐式转换成包装对象）和引用类型， 不能判断undefined null
 * 4 Object.prototype.toString.call(this)
 *   官方给出的最准确方法
 */